package com.zmn.mcc.business.interfaces.role;

import com.zmn.common.dto2.ResponseDTO;
import com.zmn.mcc.common.dto.role.RoleDIO;
import com.zmn.mcc.common.dto.role.RoleDRO;
import com.zmn.mcc.model.entity.dept.McDept;
import com.zmn.mcc.model.entity.role.McRole;

import java.util.List;

/**
 * @author heguanghua
 * @since 2020/04/14 22:02
 */
public interface RoleBService {

    /**
     * 取得全部系统的模块和权限列表
     * 确保在操作人角色权限范围内授权
     *
     * @param roleId     角色ID
     * @param operatorId 操作人staffId，如操作人拥有"系统全局角色"，则读取所有权限清单，否则只读取其拥有的角色权限清单
     * @param status
     * @return
     */
    ResponseDTO listModulePermit(Integer roleId, Integer operatorId, Integer status);

    /**
     * 查询角色列表
     *
     * @param roleDIO 角色
     * @return
     */
    List<RoleDRO> listByDIO(RoleDIO roleDIO);

    /**
     * 批量查询
     *
     * @param ids 角色ID
     * @return
     */
    List<RoleDRO> listByIds(List<Integer> ids);

    /**
     * 新增角色
     *
     * @param role
     * @return
     */
    ResponseDTO addRole(McRole role);

    /**
     * 修改角色
     *
     * @param role
     * @return
     */
    ResponseDTO modifyRole(McRole role);

    /**
     * 为角色分配权限
     * 未拥有"系统全局角色"的操作人许可范围：
     * 1）只能修改其所属部门及下级部门的部门内部角色
     * 2）只能分配其所属部门(不包括下级部门)默认角色的权限
     *
     * @param roleId     角色ID
     * @param permitIds  权限ID
     * @param operatorId 操作人staffId
     * @param ip 操作人ip
     * @return
     */
    ResponseDTO assignPermitBatch(Integer roleId, List<Integer> permitIds, Integer operatorId,String ip);

    /**
     * 校验角色是否属于自己部门及下级部门(部门默认角色或部门内部角色)
     * 操作人无"系统全局角色"时校验
     *
     * @param roleId       角色ID
     * @param operatorDept 操作人所属部门
     * @return
     */
    boolean checkDeptRole(Integer roleId, McDept operatorDept);

    /**
     * 描述: 复制角色
     *
     * @param roleId roleId
     * @param ids    ids
     * @return boolean
     * @author jiafei
     * @since 2022/6/21 10:11
     */
    boolean copy(Integer roleId, String ids);
}
